package leecode;

import org.apache.commons.collections.CollectionUtils;

import org.junit.Test;

import java.util.Arrays;
import java.util.HashSet;

/**
 * @Classname Solution_318
 * @Description TODO
 * @Date 2021/11/17 10:58
 * @Created by Alberthch
 * 题目：最大单词长度乘积
 * 题目描述：给定一个字符串数组words，找到length(word[i]) * length(word[j])的最大值，
 * 并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词，返回0。
 */
public class Solution_318 {
    // 暴力方法，两重循环，得到更大的值的时候进行更新;该方法，时间复杂度和空间复杂度都不可取，是立方级时间复杂度
    public int maxProduct(String[] words) {
        // 初始情况其实是如果该参数没有得到更新会得到的结果
        int max = 0;
        HashSet set_1 = new HashSet();
        HashSet set_2 = new HashSet();
        for (int i = 0; i < words.length; i++) {
            for (int j = i+1; j < words.length; j++) {

                array_to_set(set_1,words[i].toCharArray());
                array_to_set(set_2,words[j].toCharArray());
                HashSet set_3 = add_set(set_1,set_2);
                // 相等就意味着没有公共字母
                if(set_1.size()+set_2.size() == set_3.size()) {
                    max = max > words[i].length() * words[j].length() ? max : words[i].length() * words[j].length();
                }

            }
        }
        return max;
    }

    // 传入参数是对象，会直接对参数进行修改
    public void array_to_set(HashSet set,char[] chars){
        //首先对set置空
        set.clear();

        for(char c: chars) {
            set.add(c);
        }
    }

    public HashSet add_set(HashSet set1,HashSet<Character> set2) {
        HashSet set3 = new HashSet(set1);
        for (char c: set2) {
            set3.add(c);
        }
        return set3;
    }

    @Test
    public void testmaxProduct(){
        String[] words = new String[]{"abcw","baz","foo","bar","xtfn","abcdef"};
        System.out.println(maxProduct(words));
    }
}
